package com.zenithmind.version.controller.handler;

import com.zenithmind.common.result.Result;
import lombok.extern.slf4j.Slf4j;

/**
 * 基础请求处理器 - 遵循单一职责原则，专门处理请求的通用逻辑
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Slf4j
public abstract class BaseRequestHandler {

    /**
     * 执行业务操作并返回结果
     * 
     * @param operation 业务操作
     * @param operationName 操作名称（用于日志）
     * @param <T> 返回类型
     * @return 统一结果
     */
    protected <T> Result<T> executeOperation(BusinessOperation<T> operation, String operationName) {
        try {
            log.info("开始执行操作: {}", operationName);
            T result = operation.execute();
            log.info("操作执行成功: {}", operationName);
            return Result.success(result);
        } catch (Exception e) {
            log.error("操作执行失败: {}, 错误信息: {}", operationName, e.getMessage(), e);
            return Result.fail(e.getMessage());
        }
    }

    /**
     * 执行无返回值的业务操作
     * 
     * @param operation 业务操作
     * @param operationName 操作名称（用于日志）
     * @return 统一结果
     */
    protected Result<Boolean> executeVoidOperation(VoidOperation operation, String operationName) {
        try {
            log.info("开始执行操作: {}", operationName);
            operation.execute();
            log.info("操作执行成功: {}", operationName);
            return Result.success(true);
        } catch (Exception e) {
            log.error("操作执行失败: {}, 错误信息: {}", operationName, e.getMessage(), e);
            return Result.fail(e.getMessage());
        }
    }

    /**
     * 业务操作接口
     * 
     * @param <T> 返回类型
     */
    @FunctionalInterface
    protected interface BusinessOperation<T> {
        T execute() throws Exception;
    }

    /**
     * 无返回值业务操作接口
     */
    @FunctionalInterface
    protected interface VoidOperation {
        void execute() throws Exception;
    }
}
